home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / signal.c < prev    next >
C/C++ Source or Header  |  1989-07-21  |  876b  |  38 lines

  1. /*
  2.  * Copyright (c) 1985 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6.  
  7. #if defined(LIBC_SCCS) && !defined(lint)
  8. static char sccsid[] = "@(#)signal.c    5.2 (Berkeley) 3/9/86";
  9. #endif LIBC_SCCS and not lint
  10.  
  11. /*
  12.  * Almost backwards compatible signal.
  13.  */
  14. #include <signal.h>
  15.  
  16. void (*
  17. signal(s, a))()
  18.     int s;
  19.     void (*a)();
  20. {
  21.     struct sigvec osv, sv;
  22.     static int mask[NSIG];
  23.     static int flags[NSIG];
  24.  
  25.     sv.sv_handler = a;
  26.     sv.sv_mask = mask[s];
  27.     sv.sv_flags = flags[s];
  28.     if (sigvec(s, &sv, &osv) < 0)
  29.         return (BADSIG);
  30.     if (sv.sv_mask != osv.sv_mask || sv.sv_flags != osv.sv_flags) {
  31.         mask[s] = sv.sv_mask = osv.sv_mask;
  32.         flags[s] = sv.sv_flags = osv.sv_flags;
  33.         if (sigvec(s, &sv, (struct sigvec *) 0) < 0)
  34.             return (BADSIG);
  35.     }
  36.     return (osv.sv_handler);
  37. }
  38.